{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# Concept Drift\n",
    "\n",
    "In the context of data streams, it is assumed that data can change over time. The change in the relationship between the data (features) and the target to learn is known as **Concept Drift**. As examples we can mention, the electricity demand across the year, the stock market, and the likelihood of a new movie to be successful. Let's consider the movie example: Two movies can have similar features such as popular actors/directors, storyline, production budget, marketing campaigns, etc. yet it is not certain that both will be similarly successful. What the target audience *considers* worth watching (and their money) is constantly changing and production companies must adapt accordingly to avoid \"box office flops\".\n",
    "\n",
    "## Impact of drift on learning\n",
    "\n",
    "Concept drift can have a significant impact on predictive performance if not handled properly. Most batch learning models will fail in the presence of concept drift as they are essentially trained on different data. On the other hand, stream learning methods continuously update themselves and adapt to new concepts. Furthermore, drift-aware methods use change detection methods (a.k.a. drift detectors) to trigger *mitigation mechanisms* if a change in performance is detected.\n",
    "\n",
    "## Detecting concept drift\n",
    "\n",
    "Multiple drift detection methods have been proposed. The goal of a drift detector is to signal an alarm in the presence of drift. A good drift detector maximizes the number of true positives while keeping the number of false positives to a minimum. It must also be resource-wise efficient to work in the context of infinite data streams.\n",
    "\n",
    "For this example, we will generate a synthetic data stream by concatenating 3 distributions of 1000 samples each:\n",
    "\n",
    "- $dist_a$: $\\mu=0.8$, $\\sigma=0.05$\n",
    "- $dist_b$: $\\mu=0.4$, $\\sigma=0.02$\n",
    "- $dist_c$: $\\mu=0.6$, $\\sigma=0.1$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2020-11-25T20:58:53.228022Z",
     "iopub.status.busy": "2020-11-25T20:58:53.227525Z",
     "iopub.status.idle": "2020-11-25T20:58:53.754511Z",
     "shell.execute_reply": "2020-11-25T20:58:53.754054Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x216 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import gridspec\n",
    "\n",
    "# Generate data for 3 distributions\n",
    "random_state = np.random.RandomState(seed=42)\n",
    "dist_a = random_state.normal(0.8, 0.05, 1000)\n",
    "dist_b = random_state.normal(0.4, 0.02, 1000)\n",
    "dist_c = random_state.normal(0.6, 0.1, 1000)\n",
    "\n",
    "# Concatenate data to simulate a data stream with 2 drifts\n",
    "stream = np.concatenate((dist_a, dist_b, dist_c))\n",
    "\n",
    "# Auxiliary function to plot the data\n",
    "def plot_data(dist_a, dist_b, dist_c, drifts=None):\n",
    "    fig = plt.figure(figsize=(7,3), tight_layout=True)\n",
    "    gs = gridspec.GridSpec(1, 2, width_ratios=[3, 1])\n",
    "    ax1, ax2 = plt.subplot(gs[0]), plt.subplot(gs[1])\n",
    "    ax1.grid()\n",
    "    ax1.plot(stream, label='Stream')\n",
    "    ax2.grid(axis='y')\n",
    "    ax2.hist(dist_a, label=r'$dist_a$')\n",
    "    ax2.hist(dist_b, label=r'$dist_b$')\n",
    "    ax2.hist(dist_c, label=r'$dist_c$')\n",
    "    if drifts is not None:\n",
    "        for drift_detected in drifts:\n",
    "            ax1.axvline(drift_detected, color='red')\n",
    "    plt.show()\n",
    "\n",
    "plot_data(dist_a, dist_b, dist_c)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### Drift detection test\n",
    "\n",
    "We will use the ADaptive WINdowing (`ADWIN`) drift detection method. Remember that the goal is to indicate that drift has occurred after samples **1000** and **2000** in the synthetic data stream."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2020-11-25T20:58:53.759698Z",
     "iopub.status.busy": "2020-11-25T20:58:53.758659Z",
     "iopub.status.idle": "2020-11-25T20:58:54.800955Z",
     "shell.execute_reply": "2020-11-25T20:58:54.801391Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Change detected at index 1055\n",
      "Change detected at index 2079\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x216 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from river import drift\n",
    "\n",
    "drift_detector = drift.ADWIN()\n",
    "drifts = []\n",
    "\n",
    "for i, val in enumerate(stream):\n",
    "    drift_detector.update(val)   # Data is processed one sample at a time\n",
    "    if drift_detector.change_detected:\n",
    "        # The drift detector indicates after each sample if there is a drift in the data\n",
    "        print(f'Change detected at index {i}')\n",
    "        drifts.append(i)\n",
    "        drift_detector.reset()   # As a best practice, we reset the detector\n",
    "\n",
    "plot_data(dist_a, dist_b, dist_c, drifts)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "We see that `ADWIN` successfully indicates the presence of drift (red vertical lines) close to the begining of a new data distribution.\n",
    "\n",
    "\n",
    "---\n",
    "We conclude this example with some remarks regarding concept drift detectors and their usage:\n",
    "\n",
    "- In practice, drift detectors provide stream learning methods with robustness against concept drift. Drift detectors monitor the model usually through a performance metric.\n",
    "- Drift detectors work on univariate data. This is why they are used to monitor a model's performance and not the data itself. Remember that concept drift is defined as a change in the relationship between data and the target to learn (in supervised learning).\n",
    "- Drift detectors define their expectations regarding input data. It is important to know these expectations to feed a given drift detector with the correct data.\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
